#ifndef UART_PROTOCOL_H
#define UART_PROTOCOL_H

#include <stdint.h>
#include <stdbool.h>

// 协议常量定义
#define PROTOCOL_HEADER_SIZE    2
#define PROTOCOL_TAIL_SIZE      2
#define PROTOCOL_MIN_FRAME_SIZE 7
#define PROTOCOL_MAX_DATA_SIZE  255
#define PROTOCOL_MAX_FRAME_SIZE (PROTOCOL_MIN_FRAME_SIZE + PROTOCOL_MAX_DATA_SIZE)

// 协议帧头和帧尾
#define PROTOCOL_HEADER_H       0xAA
#define PROTOCOL_HEADER_L       0x55
#define PROTOCOL_TAIL_H         0x0D
#define PROTOCOL_TAIL_L         0x0A

// ESP32主机下发命令 (0x10-0x1F)
#define CMD_UV_CONTROL          0x10  // UV控制
#define CMD_HYDROGEN_CONTROL    0x11  // 制氢控制
#define CMD_LIGHT_COLOR         0x12  // 灯光颜色
#define CMD_LIGHT_MODE          0x13  // 灯光模式
#define CMD_BUZZER_CONTROL      0x14  // 蜂鸣器控制
#define CMD_CLEAN_CONTROL       0x15  // 清洗控制
#define CMD_SHUTDOWN            0x16  // 关机控制
#define CMD_BACKLIGHT_CONTROL   0x17  // 背光控制

// PY32从机上报命令 (0x20-0x2F)
#define CMD_CHARGE_STATUS       0x20  // 充电状态

// 通用响应命令 (0x30-0x3F)
#define CMD_HEARTBEAT           0x31  // 心跳包

// 控制状态定义
#define STATUS_OFF              0x00
#define STATUS_ON               0x01

// 灯光颜色定义
#define LIGHT_COLOR_RED         0x01  // 红灯
#define LIGHT_COLOR_YELLOW      0x02  // 黄灯
#define LIGHT_COLOR_BLUE        0x03  // 蓝灯
#define LIGHT_COLOR_PURPLE      0x04  // 紫灯
#define LIGHT_COLOR_GREEN       0x05  // 绿灯
#define LIGHT_COLOR_CYAN        0x06  // 青灯
#define LIGHT_COLOR_WHITE       0x07  // 白灯

// 灯光模式定义
#define LIGHT_MODE_OFF          0x00  // 关闭
#define LIGHT_MODE_CONSTANT     0x01  // 常亮
#define LIGHT_MODE_BREATHING    0x02  // 呼吸
#define LIGHT_MODE_RAINBOW      0x03  // 七彩渐变

// 充电状态定义
#define CHARGE_STATUS_NONE      0x00  // 未充电
#define CHARGE_STATUS_CHARGING  0x01  // 充电中
#define CHARGE_STATUS_COMPLETE  0x02  // 已充满

// 协议帧结构
typedef struct {
    uint8_t header[2];      // 帧头 0xAA55
    uint8_t length;         // 数据长度
    uint8_t command;        // 命令字
    uint8_t data[PROTOCOL_MAX_DATA_SIZE];  // 数据
    uint8_t checksum;       // 校验和
    uint8_t tail[2];        // 帧尾 0x0D0A
} protocol_frame_t;

// 协议解析状态
typedef enum {
    PARSE_STATE_HEADER_H,
    PARSE_STATE_HEADER_L,
    PARSE_STATE_LENGTH,
    PARSE_STATE_COMMAND,
    PARSE_STATE_DATA,
    PARSE_STATE_CHECKSUM,
    PARSE_STATE_TAIL_H,
    PARSE_STATE_TAIL_L,
    PARSE_STATE_COMPLETE
} parse_state_t;

// 协议解析器结构
typedef struct {
    parse_state_t state;
    uint8_t data_index;
    uint8_t expected_length;
    uint8_t calculated_checksum;
    protocol_frame_t frame;
} protocol_parser_t;

// 协议处理回调函数类型
typedef void (*protocol_callback_t)(uint8_t command, uint8_t *data, uint8_t length);

// 协议API函数声明
void protocol_init(protocol_parser_t *parser);
bool protocol_parse_byte(protocol_parser_t *parser, uint8_t byte);
uint8_t protocol_build_frame(uint8_t command, uint8_t *data, uint8_t length, uint8_t *frame_buffer);
uint8_t protocol_calculate_checksum(uint8_t length, uint8_t command, uint8_t *data);
bool protocol_validate_frame(protocol_frame_t *frame);

// ESP32主机端API
void esp32_send_uv_control(uint8_t status);
void esp32_send_hydrogen_control(uint8_t status);
void esp32_send_light_color(uint8_t color);
void esp32_send_light_mode(uint8_t mode);
void esp32_send_buzzer_control(uint8_t count);
void esp32_send_clean_control(uint8_t status);
void esp32_send_shutdown(void);
void esp32_send_backlight_control(uint8_t status);
void esp32_send_heartbeat(void);

// PY32从机端API
void py32_send_charge_status(uint8_t status);
void py32_send_heartbeat(void);

// 通用发送函数 (需要用户实现)
extern void uart_send_data(uint8_t *data, uint8_t length);

#endif // UART_PROTOCOL_H 